home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1997 September & October / Amiga-CD 1997 #9-10.iso / aminet / gameboyemulator / z80.h < prev   
C/C++ Source or Header  |  1995-10-29  |  5KB  |  126 lines

  1. /** VGB: portable GameBoy emulator ***************************/
  2. /**                                                         **/
  3. /**                           Z80.h                         **/
  4. /**                                                         **/
  5. /** This file contains declarations relevant to emulation   **/
  6. /** of Z80 CPU. See GB.h for #defines related to drivers    **/
  7. /** and GameBoy emulation.                                  **/
  8. /**                                                         **/
  9. /** Copyright (C) Marat Fayzullin 1994,1995                 **/
  10. /**     You are not allowed to distribute this software     **/
  11. /**     commercially. Please, notify me, if you make any    **/   
  12. /**     changes to this file.                               **/
  13. /*************************************************************/
  14.  
  15. #define DEBUG                  /* Compile debugging version  */
  16. #define INTERRUPTS             /* Compile interrupts code    */
  17. /* #define LSB_FIRST */        /* Compile for low-endian CPU */
  18. /* #define LAME */             /* Compile simplified version */
  19.  
  20.  
  21. #define S_FLAG      0x80
  22. #define Z_FLAG      0x40
  23. #define H_FLAG      0x10
  24. #define P_FLAG      0x04
  25. #define V_FLAG      0x04
  26. #define N_FLAG      0x02
  27. #define C_FLAG      0x01
  28.  
  29.  
  30. /**********************************************************/
  31. /*** NOTICE: sizeof(byte)=1 and sizeof(word)=2          ***/
  32. /**********************************************************/
  33. typedef unsigned char byte;
  34. typedef unsigned short word;
  35. typedef signed char offset;
  36.  
  37.  
  38. /*** Interrupts *******************************************/
  39. /*** Interrupt-related variables.                       ***/
  40. /**********************************************************/
  41. #ifdef INTERRUPTS
  42. extern word IPeriod;  /* Number of commands between internal interrupts */
  43. extern byte IntSync;  /* Generate internal interrupts if IntSync==1     */
  44. extern byte IFlag;    /* If IFlag==1, generate interrupt and set to 0   */
  45. #endif
  46.  
  47.  
  48. /*** Trace and Trap ***************************************/         
  49. /*** Switches to turn tracing on and off in DEBUG mode. ***/
  50. /**********************************************************/
  51. #ifdef DEBUG
  52. extern byte Trace;  /* Tracing is on if Trace==1  */
  53. extern word Trap;   /* When PC==Trap, set Trace=1 */
  54. #endif
  55.  
  56. /*** TrapBadOps *******************************************/
  57. /*** When 1, print warnings of illegal Z80 instructions.***/
  58. /**********************************************************/
  59. extern byte TrapBadOps;
  60.  
  61. /*** CPURunning *******************************************/
  62. /*** When 0, execution terminates.                      ***/
  63. /**********************************************************/
  64. extern byte CPURunning;
  65.  
  66. /**********************************************************/
  67. /*** #define LSB_FIRST for machines where least         ***/
  68. /*** signifcant byte goes first.                        ***/
  69. /**********************************************************/
  70. typedef union
  71. {
  72. #ifdef LSB_FIRST
  73.   struct { byte l,h; } B;
  74. #else
  75.   struct { byte h,l; } B;
  76. #endif
  77.   word W;
  78. } pair;
  79.  
  80.  
  81. typedef struct
  82. {
  83.   pair AF,BC,DE,HL,IX,IY,PC,SP;
  84.   pair AF1,BC1,DE1,HL1;
  85.   byte IFF,I;
  86. } reg;
  87.  
  88.  
  89. /*** Interpret Z80 code: **********************************/
  90. /*** RAM starts at Addr and registers have initial      ***/
  91. /*** values from Regs. PC value at which emulation      ***/
  92. /*** stopped is returned by this function.              ***/
  93. /**********************************************************/
  94. word Z80(byte *Addr,reg Regs);
  95.  
  96.  
  97. /*** Input/Output values from/to ports: *******************/
  98. /*** These are called on IN and OUT commands and should ***/
  99. /*** supplied by machine-dependent part of the code.    ***/
  100. /**********************************************************/
  101. byte DoIn(byte Port);
  102. void DoOut(byte Port,byte Value);
  103.  
  104.  
  105. #ifdef DEBUG
  106. /*** Single-step debugger *********************************/
  107. /*** This function should exist if DEBUG is #defined.   ***/
  108. /*** If Trace==1 it is called after each command        ***/
  109. /*** executed by the CPU and given address of the       ***/
  110. /*** address space and the register file.               ***/
  111. /**********************************************************/
  112. void Z80_Debug(byte *A,reg R);
  113. #endif
  114.  
  115.  
  116. #ifdef INTERRUPTS
  117. /*** Interrupt handler ************************************/
  118. /*** This function should exist if INTERRUPTS is        ***/
  119. /*** #defined. It is called on each attempted interrupt ***/
  120. /*** and should return an interrupt address to proceed  ***/
  121. /*** with interrupt or 0xFFFF to continue execution.    ***/ 
  122. /**********************************************************/
  123. word Interrupt(void);
  124. #endif
  125.  
  126.